Passed
Push — master ( 2529fd...42b327 )
by Matt
02:50 queued 13s
created

map.js ➔ unselectedWanderStyle   A

Complexity

Conditions 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
c 0
b 0
f 0
dl 0
loc 5
rs 10
1
// TODO: Refactor the heck out of this mess
2
3
/* LeafletJS */
4
/** global: L */
5
/* global L */ /* For ESLint */
6
7
var streetMap;
8
var satelliteMap;
9
10
11
var base = L.latLng($("#mapid").data("homebaseLat"), $("#mapid").data("homebaseLng"));
12
13
function setUpMap(options)
14
{
15
    var mapboxAccessToken = $("#mapid").data("mapboxAccessToken");
16
    var locusRadius = 1609.34; // 1 mile
17
18
    streetMap = L.tileLayer(
19
        "https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}@2x?access_token=" + mapboxAccessToken,
20
        {
21
            // These are mapbox-specific
22
            id: "gothick/ckhb31na304g619t67r3gcngx",
23
            tileSize: 512,
24
            zoomOffset: -1,
25
            // More general
26
            maxZoom: 19,
27
            attribution: "Map data &copy; <a href='https://www.openstreetmap.org/'>OpenStreetMap</a> contributors, <a href='https://creativecommons.org/licenses/by-sa/2.0/'>CC-BY-SA</a>, Imagery © <a href='https://www.mapbox.com/'>Mapbox</a>"
28
        });
29
30
    satelliteMap = L.tileLayer(
31
        "https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}@2x?access_token=" + mapboxAccessToken,
32
        {
33
            // These are mapbox-specific
34
            id: "gothick/ckhwgr59r0uai19o077hp87w4",
35
            tileSize: 512,
36
            zoomOffset: -1,
37
            // More general
38
            maxZoom: 19,
39
            attribution: "Map data &copy; <a href='https://www.openstreetmap.org/'>OpenStreetMap</a> contributors, <a href='https://creativecommons.org/licenses/by-sa/2.0/'>CC-BY-SA</a>, Imagery © <a href='https://www.mapbox.com/'>Mapbox</a>"
40
        });
41
42
    var circle = L.circle(base, {
43
        color: "green",
44
        fillColor: "#faa",
45
        fillOpacity: 0.15,
46
        radius: locusRadius,
47
        interactive: false
48
    });
49
50
    // Because Object.assign isn't supported in older browsers
51
    // https://stackoverflow.com/a/41455739/300836
52
    $.extend(options, {
53
        maxBounds: base.toBounds(locusRadius * 5), // Give a bit of wiggle room around the circle, but don"t let the user drift too far away
54
        layers: [streetMap, circle],
55
        loadingControl: true, // https://github.com/ebrelsford/Leaflet.loading
56
    });
57
58
    var map = L.map("mapid", options)
59
        .setView(base, 14);
60
61
    var baseMaps = {
62
        "Satellite": satelliteMap,
63
        "Streets": streetMap
64
    };
65
66
    L.control.layers(baseMaps).addTo(map);
67
    L.control.scale().addTo(map);
68
69
    L.control.locate().addTo(map);
70
71
    return map;
72
}
73
74
function selectedWanderStyle() {
75
    return {
76
        color: "#FFA500"
77
    };
78
}
79
80
function unselectedWanderStyle() {
81
    return {
82
        color: "#3388FF"
83
    };
84
}
85
86
var currentlySelected = null;
87
88
 var photoLayer = null;
89
90
 function addPhotos(map, photos)
91
 {
92
    if (photoLayer) {
93
        map.removeLayer(photoLayer);
94
    }
95
96
    photoLayer = L.photo.cluster().on("click", function(evt) {
97
        var photo = evt.layer.photo;
98
        var template = "<a href='{imageShowUri}'><img src='{url}' width='300' /></a><p>{caption}</p>";
99
        // TODO: Video
100
        evt.layer.bindPopup(L.Util.template(template, photo), {
101
            className: "leaflet-popup-photo",
102
            minWidth: 300
103
        }).openPopup();
104
    });
105
106
    photoLayer.add(photos).addTo(map);
107
}
108
109
function addWanderImages(map, wanderId)
110
{
111
    var photos = [];
112
113
    // Our API allows us to grab only those photos with co-ordinates set
114
    $.getJSON("/api/wanders/" + wanderId + "/images?exists[latlng]=true", function(images) {
115
        $.each(images["hydra:member"], function(key, image) {
116
            photos.push({
117
                lat: image.latlng[0],
118
                lng: image.latlng[1],
119
                url: image.mediumImageUri,
120
                caption: image.title || "",
121
                thumbnail: image.markerImageUri,
122
                imageShowUri: image.imageShowUri,
123
                // TODO?
124
                video: null
125
            });
126
        });
127
        addPhotos(map, photos);
128
    });
129
}
130
131
function addWanders(url, map)
132
{
133
    map.fireEvent('dataloading'); // Triggers loading spinner
134
    // TODO: We should probably use some kind of Hydra client. This"ll do for now.
135
    $.getJSON(url, function(data) {
136
        var nextPage = data["hydra:view"]["hydra:next"];
137
        var isLastPage = (typeof nextPage) == 'undefined';
138
        var last = data["hydra:member"].length - 1;
139
        $.each(data["hydra:member"], function(key, wander) {
140
            var isLastWander = isLastPage && (last === key);
141
            var geoJsonFeature = {
142
                "type": "Feature",
143
                "geometry":  $.parseJSON(wander.geoJson)
144
            };
145
            var geoJsonTrack = L.geoJSON(
146
                geoJsonFeature,
147
                {
148
                    style: isLastWander ? selectedWanderStyle() : unselectedWanderStyle(),
149
                    wanderId: wander.id
150
                })
151
                .bindPopup(function(layer) {
152
                    currentlySelected.setStyle(unselectedWanderStyle());
153
                    layer.setStyle(selectedWanderStyle());
154
                    layer.bringToFront();
155
                    currentlySelected = layer;
156
                    addWanderImages(map, layer.options.wanderId);
157
                    // Popup
158
                    var template = "<a href='{contentUrl}'>{title}</a>";
159
                    return L.Util.template(template, wander);
160
                });
161
162
            if (isLastWander) {
163
                currentlySelected = geoJsonTrack;
164
            }
165
            geoJsonTrack.addTo(map);
166
        });
167
168
        // Recurse through all the pages in the pagination we got back.
169
170
        if (!isLastPage) {
171
            addWanders(nextPage, map);
172
        }
173
    })
174
    .always(function() {
175
        map.fireEvent("dataload"); // Finishes loading spinner
176
    });
177
}
178
179
function addAllWanders(map)
180
{
181
    addWanders("/api/wanders", map);
182
}
183
184
function addWander(map, wanderId, addImages)
185
{
186
    $.getJSON("/api/wanders/" + wanderId, function(wander) {
187
        var geoJsonFeature = {
188
            "type": "Feature",
189
            "geometry": $.parseJSON(wander.geoJson)
190
        };
191
        L.geoJSON(geoJsonFeature)
192
            .bindPopup(function(/* layer */) {
193
                return wander.title;
194
            })
195
            .addTo(map);
196
        // Based on the example at https://github.com/turban/Leaflet.Photo/blob/gh-pages/examples/picasa.html
197
        if (addImages) {
198
            addWanderImages(map, wanderId);
199
        }
200
    });
201
}
202